// 用户路由表

// 加载模块
const express = require('express');
const jwt = require('jsonwebtoken');
const usersModel = require('../db/models/usersModel.js');

// 创建路由表
let router = express.Router();

// 向路由表添加内容：

// 登录的流程：
// 1.前端发送登录请求（发送参数username/password）
// 2.后端接收登录请求（接收参数username/password）
// 3.根据接收到的参数查询数据库
// 4.根据查询结果判断是否登录成功
// 5.后端响应登录结果给前端
// 6.前端接收登录结果并反馈给用户

// 验证是否已登录接口
router.get('/islogin',(req,res)=>{
    let token = req.headers.authorization;
    // console.log( token );

    // 验证token
    jwt.verify(token,'abc123',(err,payload)=>{
        if (err) {
            // 响应请求
            res.send({"code":0,"msg":err});
        } else {
            // 响应请求
            res.send({"code":1,"msg":"token验证成功","info":payload});
        }
    })
})

router.get('/login',(req,res)=>{// f1
    // 接收参数
    let {username,password} = req.query;

    // 查询数据库
    // usersModel.find({$and:[{'username':username},{'password':password}]})
    usersModel.find({$and:[{username},{password}]})
    .then((result)=>{
        // result = [{}]
        // 判断是否登录成功
        if (result.length > 0) {
            // 创建一个token并返回给前端
            let token = jwt.sign({// 存储当前登录用户的信息
                username: result[0].username,
                nickname: result[0].nickname
            },'abc123',{expiresIn:60});

            // 响应请求
            res.send({"code":1,"msg":"登录成功！","token":token});
        } else {
            // 响应请求
            res.send({"code":0,"msg":"账号或密码错误！"});
        }
    })
    .catch((err)=>{
        // 响应请求
        res.send({"code":-1,"msg":err});
    });
});


// 注册的流程：
// 1.前端发送注册请求（发送参数username/password/nickname/email/sex/age）
// 2.后端接收注册请求（接收参数username/password/nickname/email/sex/age）
// 3.查询数据库判断当前username是否已注册
// 4.如果当前username已注册，后端响应注册结果给前端
// 5.如果当前username未注册，后端校验注册的数据是否符合要求
// 6.如果数据校验失败，后端响应注册结果给前端
// 7.如果数据校验成功，后端向users集合添加一条数据
// 8.后端响应注册结果给前端
// 9.前端接收注册结果并反馈给用户

router.post('/register',(req,res)=>{// f2
    // 接收参数
    let {username,password,nickname,email,sex,age} = req.body;

    // 查询数据库
    usersModel.find({username}) // p1
    .then((result)=>{
        // 判断是否已被注册
        if (result.length > 0) {// 已注册
            // 响应请求
            res.send({"code":-1,"msg":"该账号已被注册！"});
            return new Promise(()=>{});// 终止链式调用
        } else {// 未注册
            let regUser = /^\w{6,18}$/;
            if (!regUser.test(username)) {
                res.send({"code":-2,"msg":"账号格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regPass = /^\w{6,14}$/;
            if (!regPass.test(password)) {
                res.send({"code":-3,"msg":"密码格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regNick = /^.{2,20}$/;
            if (!regNick.test(nickname)) {
                res.send({"code":-4,"msg":"昵称格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            // '99835885@qq.com'
            let regMail = /^\w{6,22}@[0-9a-zA-Z]{1,12}(\.[a-zA-Z]{2,3}){1,2}$/;
            if (!regMail.test(email)) {
                res.send({"code":-5,"msg":"邮箱格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regSex = /^[男|女|妖]$/;
            if (!regSex.test(sex)) {
                res.send({"code":-6,"msg":"性别格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            let regAge = /^\d{1,3}$/;
            if (!regAge.test(age)) {
                res.send({"code":-7,"msg":"年龄格式不符合要求！"});
                return new Promise(()=>{});// 终止链式调用
            }
            // 向数据库添加一条数据
            return usersModel.insertMany({username,password,nickname,email,sex,age});
        }
    })// p2
    .then((result)=>{
        if (result.length > 0) {
            // 响应前端
            res.send({"code":1,"msg":"注册成功！"});
        } else {
            // 响应前端
            res.send({"code":0,"msg":"注册失败！"});
        }
    })
    .catch((err)=>{
        // 响应前端
        res.send({"code":-8,"msg":err});
    })
});

router.get('/resetPass',(req,res)=>{// f3
    res.send('resetPass is ok');
})

router.get('/center',(req,res)=>{// f4
    res.send('center is ok');
})

router.get('/test1',(req,res)=>{// f4
    let {a,b} = req.query;

    setTimeout(()=>{
        // 响应前端
        res.send([a,b]);
    },3500);
})

// 代理请求接口
const https = require('https');
const { log } = require('console');
router.get('/getdata',(req,res)=>{
    // 服务端不受浏览器的同源策略限制！
    // 目标请求地址：
    let targetURL = 'https://m.you.163.com/xhr/index.json';
    // 发送请求
    https.get(targetURL,(response)=>{
        let data = '';
        response.on('data',(chunk)=>{
            // chunk 数据片段 二进制数据 Buffer
            // 当接收到一个数据片段chunk时，会触发data事件，执行该函数
            data += chunk;// 转成字符串并拼接数据
        })
        response.on('end',()=>{
            // 当数据片段接收完成时，触发end事件，执行该函数
            // 响应请求
            res.send(data);
        })
    })
})

// CORS测试接口
router.get('/getlist',(req,res)=>{
    let datas = [
        {"name":"张三","age":23},
        {"name":"李四","age":24},
        {"name":"王五","age":25},
        {"name":"马六","age":26}
    ];
    // 响应请求
    res.send(datas);
})

// jsonp测试接口
router.get('/getjson',(req,res)=>{
    // 接收参数
    let {a,b,callback} = req.query;
    console.log( a,b );// 123 456
    console.log( callback );// 'test'   'show'

    // 响应数据
    // let data = 'alert("hello")';
    // let data = 'var data = {"name":"张三"}';
    // let data = 'test({"name":"张三"})';
    // let data = 'show({"name":"张三"})';
    // 响应请求
    // res.send(data);

    // 响应请求
    let data = {"name":"张三"};
    let result = `${callback}(${JSON.stringify(data)})`;// 'show({"name":"张三"})'
    res.send(result);
})

// 对外暴露接口
module.exports = router;
